import cv2
import numpy as np
import pyautogui
import time

# 切换到日K线的自动操作


# 可能会有多个匹配, 返回所有匹配先
def find_all_matches(screen_img, template_img, threshold):
    """获取所有符合阈值的匹配结果，返回列表[(x, y, w, h, 匹配度)]"""
    # # 预处理（使用之前优化的预处理函数）
    # screen_processed = preprocess_image(screen_img)
    # template_processed = preprocess_image(template_img, is_template=True)
    h, w = template_img.shape[:2]
    
    if h == 0 or w == 0:
        return []
    
    # 执行模板匹配并获取匹配度矩阵
    result = cv2.matchTemplate(
        screen_img, 
        template_img, 
        cv2.TM_CCOEFF_NORMED
    )
    # 找到所有超过阈值的位置
    locations = np.where(result >= threshold)
    matches = []
    
    # 遍历所有匹配位置，记录坐标和匹配度
    for y, x in zip(locations[0], locations[1]):
        match_value = result[y, x]  # 该位置的匹配度（0-1）
        matches.append((x, y, w, h, match_value))  # 存储x坐标、y坐标、宽、高、匹配度
    return matches


# 找 模板匹配
def find_template_position(screen_img, template_img, threshold=0.85):
    """
    在屏幕截图中查找模板位置
    :param screen_img: 全屏截图（BGR格式）
    :param template_img: 模板图片（BGR格式）
    :param threshold: 匹配阈值（0-1，越高越严格） 数值为0.8时,还是会有错误, 比如需匹配0.00%,匹配到的却是0.05%
    :return: 匹配区域的左上角坐标(x, y)，若未找到返回None
    """

    all_matches  = find_all_matches(screen_img, template_img,threshold)
    if not all_matches:
        return None  # 无匹配结果
    # 按X坐标升序排序（X越小越靠左），取第一个
    # 若X相同，可选匹配度最高的
    all_matches.sort(key=lambda m: (m[0], -m[1]))  # 优先按X排序，再按y排序 找到左上角的一个叉按钮
    rightmost = all_matches[0]
    return (rightmost[0], rightmost[1], rightmost[2], rightmost[3])  # 返回(x, y, w, h)

def click_button(pos_x, pos_y, window_pos_x,window_pos_y, width, height):
    """
    模拟鼠标点击按钮
    
    参数:
    pos_x -- 按钮左上角x坐标
    pos_y -- 按钮左上角y坐标
    width -- 按钮宽度
    height -- 按钮高度
    """
    # 计算按钮中心点坐标（点击按钮中心更符合实际操作习惯）
    center_x = pos_x + width / 2
    center_y = pos_y + height / 2
    
    # 移动鼠标到按钮中心
    pyautogui.moveTo(center_x+window_pos_x, center_y+window_pos_y, duration=0.0)  # duration控制移动速度，单位秒
    print("移动结束",window_pos_x,window_pos_y)
    # 点击鼠标左键
    pyautogui.click()

# 切换到日K线的自动操作
def set_to_daily_k_line(screen_shot_img):
    # return True:已完成  False:未完成

    # BEGIN 防范
    if(screen_shot_img is None or screen_shot_img.shape[0] < 10 or screen_shot_img.shape[1] < 10) :
        print("!!!!    ERR 82 可能窗口是最小化状态, 无法进行操作")
        return False

    if screen_shot_img is None: return False
    if screen_shot_img.shape[0] < 10 or screen_shot_img.shape[1] < 10: return False

    # 1. 判断是不是个股K线的状态
    template_img_1_active = cv2.imread("eastmoney desktop software picture/button_k_line_pushed.png")  # 模板路径 这是K线按钮已经按下的状态
    # 2. 查找模板位置
    target_pos_active = find_template_position(screen_shot_img, template_img_1_active)
    if target_pos_active is None:
        print("未找到K线激活状态")
    elif target_pos_active:
        print("K线已激活")
        return True
    
    # 往下执行, 就是K线未激活状态. 分两种情况, 1. 不是个股, 2. 在盘内分时图的状态
    template_img_1_idle = cv2.imread("eastmoney desktop software picture/button_k_line_idle.png")  # 模板路径 这是K线按钮没被选中的状态
    # 2. 查找模板位置
    target_pos_idle = find_template_position(screen_shot_img, template_img_1_idle)
    if target_pos_idle is None:
        print("# 76 不是个股状态")
        # 按000001切换到个股状态
        # 要输入的数字序列
        numbers = "000001"
        # 依次模拟小键盘输入每个数字
        for num in numbers:
            # 小键盘数字的按键名称是'num0'到'num9'
            key = f'num{num}'
            pyautogui.press(key)
            # 每个按键之间可以添加短暂延迟，避免输入过快
            time.sleep(0.1)
        pyautogui.press("enter")
        time.sleep(0.1)
    else:
        print("是个股状态")
        # 按F5切换
        pyautogui.press("f5")
        time.sleep(0.1)

    return False # 返回 , 等新的截图过来再进行判断

window_pos = (0,0)

def set_window_pos(x,y):
    global window_pos
    window_pos = (x,y)

def set_to_chip_chart(screen_shot_img):
    # return True:已完成  False:未完成

    if screen_shot_img is None: return False
    if screen_shot_img.shape[0] < 10 or screen_shot_img.shape[1] < 10: return False

    # 1. 获取模板图片
    template_img_1_activated = cv2.imread("eastmoney desktop software picture/button_chip_activated.png")  # 模板路径 这是K线按钮没被选中的状态
    template_img_1_idle = cv2.imread("eastmoney desktop software picture/button_chip_idle.png")

    # 2. 取图像位置, 看是否存在些图像
    target_pos_activated = find_template_position(screen_shot_img, template_img_1_activated)
    if target_pos_activated is not None:
        return True
    
    # 找按钮
    target_pos_idle = find_template_position(screen_shot_img, template_img_1_idle)
    if(target_pos_idle is None ):
        print("!!!!    ERR 148 找不到筹码按钮")
        return False
    x,y,w,h = target_pos_idle
    
    click_button( x,y,window_pos[0],window_pos[1],w,h) # window_pos
    time.sleep(0.1)

    return False
    



